package com.recordhistory.utils;

import com.recordhistory.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author ：LX
 * 创建时间： 2019/6/18. 10:43
 * 地点：广州
 * 目的: 文件工具类
 * 备注说明：
 */
public class FileTool {

    private static Logger logger = LoggerFactory.getLogger(FileTool.class);


    /**
     * 对文件夹位置进行初始化，没有就创建
     * path : 文件路径
     */
    public static String init(String path){
        if (CheckTool.checkNull(path)){
            throw new ServiceException("文件路径不能为空");
        }
        File file = new File(path);
        //判断目标文件所在的目录是否存在
        if (! folderisExists(file)){
            //如果目标文件所在的目录不存在，则创建目录（注意，如果是文件夹，应该是创建父目录，否则创建目录即可）
            boolean mkdirs = file.mkdirs();
            if (mkdirs){
                logger.info("创建文件夹成功，path:" + path);
            }
        }

        return path;
    }


    /**
     * 文件夹是否存在
     * @param file
     * @return true 存在 false 不存在
     */
    public static boolean folderisExists(File file){
        if (!file.exists() && !file.isDirectory()){
            //文件不存在
            return false;
        } else {
            //文件夹存在
            return true;
        }
    }

    /**
     * 删除文件和目录(可以是文件或文件夹)
     * @param filePath 要删除的文件名路径
     * @return 如果成功返回true，否则false
     */
    public static boolean delectFile(String filePath){
        File file = new File(filePath);
        if (!fileIsExists(file)){
            logger.error("要删除的，" + filePath + "文件不存在");
            return false;
        } else {
            //如果是一个文件
            if (file.isFile()){
                logger.debug("文件删除成功");
                return file.delete();
            } else {
                logger.error("文件删除失败");
                return false;
            }
        }
    }

    /**
     * 判断文件是否存在
     * @param file 文件
     * @return true 存在 false 不存在
     */
    public static boolean fileIsExists(File file) {
        if (file.exists()) {
            //文件存在
            return true;
        } else {
            //文件不存在
            return false;
        }

    }


    /**
     * 将 MultipartFile 写入到硬盘指定位置
     * @param path 要写入到硬盘的路径, 比如: d://1.jpg
     * @param file MultipartFile对象
     */
    public static void multipartFileWriteFile(String path, MultipartFile file){
        OutputStream outputstream = null;
        InputStream inputstream = null;
        File realFile = new File(path);

        try {
            inputstream = file.getInputStream();
            outputstream = new FileOutputStream(realFile);
            byte[] buffer = new byte[1024 * 5];
            int byteRead = -1;
            while ((byteRead = (inputstream.read(buffer))) != -1) {
                outputstream.write(buffer, 0, byteRead);
            }

            //设置可执行权限
            realFile.setExecutable(false);

        } catch (IOException e){
            throw new ServiceException("文件写入失败");

        } finally {
            if (outputstream != null) {
                try {
                    outputstream.flush();
                    outputstream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputstream != null) {
                try {
                    inputstream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
